#pragma once
#include <cstdint>
#include <string>
#include <vector>

namespace protocol {

// 消息类型，用于区分是关键字推荐还是网页搜索
enum class MsgType : int32_t {
    KEYWORD_RECOMMEND_REQ = 1,
    KEYWORD_RECOMMEND_RESP = 2,
    PAGE_SEARCH_REQ = 3,
    PAGE_SEARCH_RESP = 4,
    ERROR_RESP = 5,
};

// TLV 消息结构
struct Message {
    int32_t tag;        // 消息类型 (使用 MsgType)
    int32_t length;     // value 的长度
    std::string value;  // 消息内容 (通常是 JSON 字符串)

    // 将 Message 对象序列化为字节流
    std::string serialize() const;
    
    // 将字节流反序列化为 Message 对象
    // 返回值: <是否成功, 读取的字节数>
    std::pair<bool, size_t> deserialize(const char* data, size_t len);
};

// TLV 消息解析器，用于处理 TCP 粘包和半包问题
class MessageParser {
public:
    MessageParser() = default;

    // 解析收到的数据流，返回解析出的一个或多个完整消息，并更新已处理的字节数
    std::vector<Message> parse(const char* data, size_t len, size_t& processedBytes);

private:
    std::vector<char> _buffer;   // 内部缓冲区，用于处理不完整的消息
};

} // namespace protocol
